package de.gof.ppstool.kundenauftragsverwaltung.ui;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.gof.ppstool.kundenauftragsverwaltung.IKundenauftragsverwaltung;
import de.gof.ppstool.kundenauftragsverwaltung.db.Kundenauftrag;
import de.gof.ppstool.kundenauftragsverwaltung.db.KundenauftragDeletedException;
import de.gof.ppstool.kundenauftragsverwaltung.db.KundenauftragNotFoundException;
import de.gof.ppstool.kundenauftragsverwaltung.db.Prognose;
import de.gof.ppstool.kundenauftragsverwaltung.db.PrognoseNotFoundException;
import de.gof.ppstool.staticdata.IStaticDataVerwaltung;
import de.gof.ppstool.staticdata.StaticDataNotFoundException;
import de.gof.ppstool.util.export.Output;
import de.gof.ppstool.util.export.SellWishItem;

@ManagedBean(name = KundenauftragsverwaltungControllerBean.NAME)
@SessionScoped
public class KundenauftragsverwaltungControllerBean implements Serializable {
	private static final long serialVersionUID = 8209974483927209620L;
	public static final String NAME = "kv";
	private Output output = Output.getInstance();
	private static final Logger LOGGER = LoggerFactory
			.getLogger(KundenauftragsverwaltungControllerBean.class);
	private static final boolean DEBUG = LOGGER.isDebugEnabled();
	final String JSF_OK_VERTRIEBSWUNSCH = "/produktionsprogramm/ok";
	final String JSF_INVALID_VERTRIEBSWUNSCH = "/produktionsprogramm/invalid";

	public KundenauftragsverwaltungControllerBean() {
		super();
	}

	@ManagedProperty(value = "#{" + IKundenauftragsverwaltung.NAME + "}")
	private IKundenauftragsverwaltung kv;
	@ManagedProperty(value = "#{" + IStaticDataVerwaltung.NAME + "}")
	private IStaticDataVerwaltung sdv;
	private Kundenauftrag kundenauftrag = new Kundenauftrag();
	private Prognose prognoseP1 = new Prognose();
	private Prognose prognoseP2 = new Prognose();
	private Prognose prognoseP3 = new Prognose();
	private String actPeriod;

	public IKundenauftragsverwaltung getKv() {
		return kv;
	}

	public void setKv(IKundenauftragsverwaltung kv) {
		this.kv = kv;
	}

	public IStaticDataVerwaltung getSdv() {
		return sdv;
	}

	public void setSdv(IStaticDataVerwaltung sdv) {
		this.sdv = sdv;
	}

	public Kundenauftrag getKundenauftrag() {
		return kundenauftrag;
	}

	public void setKundenauftrag(Kundenauftrag kundenauftrag) {
		this.kundenauftrag = kundenauftrag;
	}

	public Prognose getPrognoseP1() {
		return prognoseP1;
	}

	public void setPrognoseP1(Prognose prognoseP1) {
		this.prognoseP1 = prognoseP1;
	}

	public Prognose getPrognoseP2() {
		return prognoseP2;
	}

	public void setPrognoseP2(Prognose prognoseP2) {
		this.prognoseP2 = prognoseP2;
	}

	public Prognose getPrognoseP3() {
		return prognoseP3;
	}

	public void setPrognoseP3(Prognose prognoseP3) {
		this.prognoseP3 = prognoseP3;
	}

	public String getActPeriod() {
		//gets the current Period from the database
		try {
			actPeriod = sdv.getCurrentPeriod();
		} catch (StaticDataNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		if (actPeriod != null) {
			try {
				kundenauftrag = kv.findeKundenauftragNachBemerkung(actPeriod);
			} catch (KundenauftragNotFoundException e1) {
				// TODO Auto-generated catch block
				//e1.printStackTrace();
				kundenauftrag.setKinderfahrrad(null);
				kundenauftrag.setDamenfahrrad(null);
				kundenauftrag.setHerrenfahrrad(null);
			}

			try {
				prognoseP1 = kv.findePrognoseNachFahrradartUndPeriode("P1",
						actPeriod);
			} catch (PrognoseNotFoundException e2) {
				//e2.printStackTrace();				
				prognoseP1.setDatenx(null);
				prognoseP1.setDateny(null);
				prognoseP1.setDatenz(null);
			}

			try {
				prognoseP2 = kv.findePrognoseNachFahrradartUndPeriode("P2",
						actPeriod);
			} catch (PrognoseNotFoundException e2) {
				//e2.printStackTrace();				
				prognoseP2.setDatenx(null);
				prognoseP2.setDateny(null);
				prognoseP2.setDatenz(null);
			}

			try {
				prognoseP3 = kv.findePrognoseNachFahrradartUndPeriode("P3",
						actPeriod);
			} catch (PrognoseNotFoundException e2) {
				//e2.printStackTrace();			
				prognoseP3.setDatenx(null);
				prognoseP3.setDateny(null);
				prognoseP3.setDatenz(null);
			}

			setOutput();
		}

		return actPeriod;
	}

	public void setActPeriod(String actPeriod) {
		try {
			this.actPeriod = sdv.getCurrentPeriod();
		} catch (StaticDataNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		;
	}

	public String neuerVertriebswunsch() {
		if (DEBUG)
			LOGGER.debug("BEGINN Kundenauftrag: " + kundenauftrag
					+ " Prognose1: " + prognoseP1 + " Prognose2: " + prognoseP2
					+ " Prognose3: " + prognoseP3);

		if (actPeriod.equals(new String("-1"))) {
			return JSF_INVALID_VERTRIEBSWUNSCH;
		} else {
			Kundenauftrag kundenauftrag1;
			try {
				kundenauftrag1 = kv.findeKundenauftragNachBemerkung(actPeriod);
				if (kundenauftrag1 != null) {
					try {
						prognoseP1.setFahrradart("P1");
						prognoseP2.setFahrradart("P2");
						prognoseP3.setFahrradart("P3");
						prognoseP1.setPeriodennr(actPeriod);
						prognoseP2.setPeriodennr(actPeriod);
						prognoseP3.setPeriodennr(actPeriod);
						kundenauftrag.setBemerkung(actPeriod);
						kundenauftrag.setKundenauftragId(kundenauftrag1
								.getKundenauftragId());
						kv.editKundenauftrag(kundenauftrag);
						kv.editPrognose(prognoseP1);
						kv.editPrognose(prognoseP2);
						kv.editPrognose(prognoseP3);
					} catch (KundenauftragDeletedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (PrognoseNotFoundException excp) {
						// TODO Auto-generated catch block
						excp.printStackTrace();
					}

				}

			} catch (KundenauftragNotFoundException e) {
				prognoseP1.setFahrradart("P1");
				prognoseP2.setFahrradart("P2");
				prognoseP3.setFahrradart("P3");
				prognoseP1.setPeriodennr(actPeriod);
				prognoseP2.setPeriodennr(actPeriod);
				prognoseP3.setPeriodennr(actPeriod);
				kundenauftrag.setBemerkung(actPeriod);
				kundenauftrag.setKundenauftragId(null);
				kundenauftrag = kv.createKundenauftrag(kundenauftrag);
				prognoseP1.setPrognose_id(null);
				prognoseP2.setPrognose_id(null);
				prognoseP3.setPrognose_id(null);
				prognoseP1 = kv.createPrognose(prognoseP1);
				prognoseP2 = kv.createPrognose(prognoseP2);
				prognoseP3 = kv.createPrognose(prognoseP3);
			}

			setOutput();
			if (DEBUG)
				LOGGER.debug("ENDE Kundenauftrag: " + kundenauftrag
						+ " Prognose1: " + prognoseP1 + " Prognose2: "
						+ prognoseP2 + " Prognose3: " + prognoseP3);

			return JSF_OK_VERTRIEBSWUNSCH;
		}

	}

	private void setOutput() {
		// Kinder
		SellWishItem kind = output.getVerkaufsWunschKind();
		kind.setArticleId(1);
		kind.setQuantity(kundenauftrag.getKinderfahrrad());
		output.setVerkaufsWunschKind(kind);
		//Damen
		SellWishItem dame = output.getVerkaufsWunschDamen();
		dame.setArticleId(2);
		dame.setQuantity(kundenauftrag.getDamenfahrrad());
		output.setVerkaufsWunschDamen(dame);
		//Herren
		SellWishItem herr = output.getVerkaufsWunschHerren();
		herr.setArticleId(3);
		herr.setQuantity(kundenauftrag.getHerrenfahrrad());
		output.setVerkaufsWunschHerren(herr);
	}

	/* 
	 * Hash-Code
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((actPeriod == null) ? 0 : actPeriod.hashCode());
		result = prime * result
				+ ((kundenauftrag == null) ? 0 : kundenauftrag.hashCode());
		result = prime * result + ((kv == null) ? 0 : kv.hashCode());
		result = prime * result
				+ ((prognoseP1 == null) ? 0 : prognoseP1.hashCode());
		result = prime * result
				+ ((prognoseP2 == null) ? 0 : prognoseP2.hashCode());
		result = prime * result
				+ ((prognoseP3 == null) ? 0 : prognoseP3.hashCode());
		return result;
	}

	/* 
	 * Equals
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;

		if (obj == null)
			return false;

		if (getClass() != obj.getClass())
			return false;

		KundenauftragsverwaltungControllerBean other = (KundenauftragsverwaltungControllerBean) obj;
		if (actPeriod == null) {
			if (other.actPeriod != null)
				return false;

		} else if (!actPeriod.equals(other.actPeriod))
			return false;

		if (kundenauftrag == null) {
			if (other.kundenauftrag != null)
				return false;

		} else if (!kundenauftrag.equals(other.kundenauftrag))
			return false;

		if (kv == null) {
			if (other.kv != null)
				return false;

		} else if (!kv.equals(other.kv))
			return false;

		if (prognoseP1 == null) {
			if (other.prognoseP1 != null)
				return false;

		} else if (!prognoseP1.equals(other.prognoseP1))
			return false;

		if (prognoseP2 == null) {
			if (other.prognoseP2 != null)
				return false;

		} else if (!prognoseP2.equals(other.prognoseP2))
			return false;

		if (prognoseP3 == null) {
			if (other.prognoseP3 != null)
				return false;

		} else if (!prognoseP3.equals(other.prognoseP3))
			return false;

		return true;
	}

	/* 
	 * toString
	 */
	@Override
	public String toString() {
		return "KundenauftragsverwaltungControllerBean [actPeriod=" + actPeriod
				+ ", kundenauftrag=" + kundenauftrag + ", prognoseP1="
				+ prognoseP1 + ", prognoseP2=" + prognoseP2 + ", prognoseP3="
				+ prognoseP3 + "]";
	}

}
